/*
 * Copyright 2014-present the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.session.web.http;

import java.util.List;
import java.util.stream.Stream;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

/**
 * Composite {@link HttpSessionIdResolver} implementation that iterates over a given
 * collection of delegate {@link HttpSessionIdResolver} instances.
 *
 * @author Yanming Zhou
 */
public class CompositeHttpSessionIdResolver implements HttpSessionIdResolver {

	private final HttpSessionIdResolver[] resolvers;

	public CompositeHttpSessionIdResolver(HttpSessionIdResolver... resolvers) {
		this.resolvers = resolvers;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public List<String> resolveSessionIds(HttpServletRequest request) {
		return Stream.of(this.resolvers)
			.flatMap((resolver) -> resolver.resolveSessionIds(request).stream())
			.distinct()
			.toList();
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void setSessionId(HttpServletRequest request, HttpServletResponse response, String sessionId) {
		for (HttpSessionIdResolver resolver : this.resolvers) {
			resolver.setSessionId(request, response, sessionId);
		}
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void expireSession(HttpServletRequest request, HttpServletResponse response) {
		for (HttpSessionIdResolver resolver : this.resolvers) {
			resolver.expireSession(request, response);
		}
	}

}
